//
// Created by Administrator on 2025/9/19.
//

#ifndef C___LEARN_OPERATOROVERLOADING_H
#define C___LEARN_OPERATOROVERLOADING_H

#include <iostream>

class Complex {
    //  返回值类型 operator 运算符名称(形参列表);
    //  友元函数重载
    friend Complex operator+(const Complex &c1, const Complex &c2);
public:
    Complex(float x = 0, float y = 0):x(x), y(y){}
    void Print();
    //  优先调用成员重载
    Complex operator+(const Complex & other);
    Complex & operator-();
    //  单目运算符重载
    //  前++
    Complex & operator++();
    //  后++
    //  int 为哑元, 该效果只在单目运算符有效
    Complex & operator++(int);
    //  对应友元
//    friend Complex & operator++(Complex &c, int);
    //  还是需要填入参数
    void Print(int);
    //  流输入输出运算符重载
    //  通过友元来实现，避免修改C++的标准库
    friend std::istream & operator >> (std::istream &, Complex&);
    friend std::ostream & operator << (std::ostream &, Complex&);

    //  赋值=，下标[]，类成员访问符->，函数运算符()，间接取值访问符->* 都没有友元函数表示
    //  因为它们必须直接操作(修改)当前对象。
    //  ++,+=等运算符虽然可以通过友元实现，但推荐为对象成员实现。
    int operator[](int index);
    //

    //  综上
    //  运算符是友元还是成员的建议
    //  所有一元运算符 ==> 成员
    //  (+= -= /= *= ^= &= != %= >>= <<=) ==> 成员
    //  other ==> 非成员
private:
    float x;
    float y;
};


//  运算符重载案例

//  提前声明
class Mail;

class Sender{
public:
    Sender(std::string addr) : addr(addr){}
    Sender & operator << (const Mail & mail);
    void Func(Mail mail);
private:
    std::string addr;
};

class Mail{
public:
    Mail(std::string t, std::string c) : title(t), content(c) {}
    friend Sender& Sender::operator << (const Mail & mail);
private:
    std::string title;
    std::string content;
};



class Pow {
public:
    int operator()(int i){
        return i * i;
    }

    double operator()(double d){
        return d * d;
    }
};




#endif